import { watch, onMounted, onShow } from "vue";
import { useStoreStore } from "@/store/modules/store";

/**
 * 监听店铺切换并自动刷新数据的 composable
 * @param {Function} refreshCallback - 刷新数据的回调函数
 * @param {Object} options - 配置选项
 * @param {Boolean} options.immediate - 是否立即执行（默认 true）
 * @param {Boolean} options.watchStore - 是否监听店铺变化（默认 true）
 * @param {Boolean} options.onShowRefresh - 是否在 onShow 时刷新（默认 true）
 */
export function useStoreRefresh(refreshCallback, options = {}) {
  const {
    immediate = true,
    watchStore = true,
    onShowRefresh = true,
  } = options;

  const storeStore = useStoreStore();

  // 防抖标志，避免重复请求
  let isRefreshing = false;
  let lastStoreId = storeStore.storeId;

  // 执行刷新的包装函数
  const executeRefresh = async (source = "unknown") => {
    if (isRefreshing) {
      console.log(`[useStoreRefresh] 正在刷新中，跳过 ${source} 触发的刷新`);
      return;
    }

    console.log(`[useStoreRefresh] 开始刷新数据，来源：${source}`);
    isRefreshing = true;

    try {
      await refreshCallback();
    } catch (error) {
      console.error(`[useStoreRefresh] 刷新数据失败：`, error);
    } finally {
      isRefreshing = false;
    }
  };

  // 监听店铺ID变化
  if (watchStore) {
    watch(
      () => storeStore.storeId,
      (newStoreId, oldStoreId) => {
        console.log(
          `[useStoreRefresh] 店铺ID变化：${oldStoreId} -> ${newStoreId}`,
        );

        // 只有当店铺ID真正变化时才刷新
        if (newStoreId && newStoreId !== lastStoreId) {
          lastStoreId = newStoreId;
          executeRefresh("店铺切换");
        }
      },
    );
  }

  // onMounted 时执行
  if (immediate) {
    onMounted(() => {
      if (storeStore.storeId) {
        executeRefresh("页面挂载");
      } else {
        console.warn("[useStoreRefresh] 缺少店铺ID，跳过初始化加载");
      }
    });
  }

  // onShow 时执行
  if (onShowRefresh) {
    onShow(() => {
      // 只有当店铺ID存在且与上次不同时才刷新
      if (storeStore.storeId && storeStore.storeId !== lastStoreId) {
        lastStoreId = storeStore.storeId;
        executeRefresh("页面显示");
      }
    });
  }

  // 返回手动刷新函数
  return {
    refresh: () => executeRefresh("手动刷新"),
  };
}

